
package com.jf.cloud.order.service;

import com.jf.cloud.api.delivery.dto.DeliveryOrderDTO;
import com.jf.cloud.common.order.bo.EsOrderBO;
import com.jf.cloud.common.order.bo.OrderStatusBO;
import com.jf.cloud.api.order.vo.OrderAmountVO;
import com.jf.cloud.api.vo.EsPageVO;
import com.jf.cloud.common.database.dto.PageDTO;
import com.jf.cloud.common.order.bo.PayNotifyBO;
import com.jf.cloud.common.order.dto.OrderDTO;
import com.jf.cloud.common.order.dto.OrderSearchDTO;
import com.jf.cloud.common.order.vo.*;
import com.jf.cloud.order.bo.SubmitOrderPayAmountInfoBO;
import com.jf.cloud.order.dto.multishop.OrderAdminDTO;
import com.jf.cloud.order.model.Order;
import com.jf.cloud.order.model.OrderItem;
import com.jf.cloud.common.order.vo.OrderVO;
import com.jf.cloud.order.vo.OrderOverviewVO;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 订单信息
 *
 * @author zz
 * @date 2020-12-05 14:13:50
 */
public interface OrderService {

    /**
     * 根据订单信息id获取订单信息
     *
     * @param orderId 订单信息id
     * @return 订单信息
     */
    Order getByOrderId(Long orderId);

    /**
     * 更新订单信息
     * @param order 订单信息
     */
    void update(Order order);

    /**
     * 根据订单信息id删除订单信息
     * @param orderId
     */
    void deleteById(Long orderId);


    /**
     * 提交订单
     * @param mergerOrder
     * @return
     */
    List<Long> submit(ShopCartOrderMergerVO mergerOrder);

    /**
     * 查询订单状态
     * @param orderIds 多个订单的订单id
     * @return 订单状态列表
     */
    List<OrderStatusBO> getOrdersStatus(List<Long> orderIds);

    /**
     * 计算订单实际金额
     * @param orderIds 多个订单的订单id
     * @return 订单实际金额总和
     */
    OrderAmountVO getOrdersActualAmount(List<Long> orderIds);

    /**
     * 将订单改为已支付状态
     * @param message 支付成功的订单信息
     * @param ordersStatus
     */
    void updateByToPaySuccess(PayNotifyBO message, List<OrderStatusBO> ordersStatus);

    /**
     * 获取订单中的金额信息，不包含退款
     * @param orderIds 多个订单的订单id
     * @return 订单商家id列表
     */
    List<OrderSimpleAmountInfoBO> getOrdersSimpleAmountInfo(List<Long> orderIds);

    /**
     * 取消订单
     * @param orderId 订单id
     */
    void cancelOrderAndGetCancelOrderIds(List<Long> orderId);

    /**
     * 根据订单号和用户id获取订单
     * @param orderId orderId
     * @param userId userId
     * @return Order
     */
    Order getOrderByOrderIdAndUserId(Long orderId, Long userId);

    /**
     * 根据订单号和自提id获取订单
     * @param orderId orderId
     * @param stationId stationId
     * @return Order
     */
    Order getOrderByOrderIdAndStationId(Long orderId, Long stationId);

    /**
     * 根据订单号和店铺id获取订单
     * @param orderId orderId
     * @return Order
     */
    OrderVO getOrderByOrderId(Long orderId);
    /**
     * 确认收货订单和mq日志要同时落地，所以要事务消息
     * 这里的确认收货，条件加上订单的状态，确保这次更新是幂等的
     * @param orderId 订单号
     * @return 是否成功
     */
    int receiptOrder(Long orderId);

    /**
     * 根据订单号删除订单
     * @param orderId 订单号
     */
    void deleteOrder(Long orderId);

    /**
     * 订单物流发货
     * @param deliveryOrderParam 发货参数
     */
    void delivery(DeliveryOrderDTO deliveryOrderParam);

    /**
     * 改变订单金额
     * @param orderAdminDTO
     * @param dbOrder
     */
    void changeAmount(OrderAdminDTO orderAdminDTO,Order dbOrder);
    /**
     * 改变预售订单金额
     * @param orderAdminDTO
     * @param dbOrder
     */
    void changeAmountByPreSale(OrderAdminDTO orderAdminDTO,Order dbOrder);

    /**
     * 根据订单id列表获取订单金额信息
     * @param orderIdList 订单id列表
     * @return
     */
    SubmitOrderPayAmountInfoBO getSubmitOrderPayAmountInfo(long[] orderIdList);

    /**
     * 获取订单需要保存到es中的数据
     * @param orderId 订单id
     * @return
     */
    EsOrderBO getEsOrder(Long orderId);

    /**
     * 计算订单项的总分销金额
     * @param orderItems
     * @return
     */
    Long sumTotalDistributionAmountByOrderItem(List<OrderItem> orderItems);

    /**
     * 获取订单和订单项信息
     * @param orderId 订单id
     * @param shopId  店铺id
     * @return
     */
    Order getOrderAndOrderItemData(Long orderId,Long shopId);

    /**
     * 获取订单和订单项信息
     * @param orderId 订单id
     * @param supplierId  店铺id
     * @return
     */
    Order getSupOrderAndOrderItemData(Long orderId, Long supplierId);

    /**
     * 计算每个订单状态的状态数量
     * @param userId 用户id
     * @return
     */
    OrderCountVO countNumberOfStatus(Long userId);

    /**
     * 我的订单分页(用户端)
     * 通过商品名称筛选时，使用es查询，否则使用mysql查询
     * @param orderSearchDTO
     * @return
     */
    EsPageVO<EsOrderVO> myOrderPage(OrderSearchDTO orderSearchDTO);

    /**
     * 订单管理分页列表
     * @param orderSearchDTO
     * @return
     */
    EsPageVO<EsOrderVO> orderPage(OrderSearchDTO orderSearchDTO);

    /**
     * 获取订单的创建状态，给秒杀提供查询是否已经创建订单成功的功能
     * @param orderId 订单id
     * @return
     */
    int countByOrderId(Long orderId);

    /**
     * 分页获取某个用户的订单数据
     * @param pageDTO
     * @param userId
     * @return
     */
    EsPageVO<EsOrderVO> pageByUserId(PageDTO pageDTO, String userId);

    /**
     * 将订单标记为已结算状态
     * @param orderIds 订单ids
     * @return 变更数量
     */
    int settledOrder(List<Long> orderIds);

    /**
     * 获取mongodb订单数据
     *
     * @param orderId
     * @return 订单信息
     */
    EsOrderBO saveMongoAndGetEsInfo(Long orderId);


    /**
     * 通过订单号获取订单信息
     * @param orderId 订单号
     * @return 订单相关信息
     */
    SendNotifyBO getOrderInfoByOrderId(Long orderId);

    /**
     * 批量修改订单采购信息
     * @param orders 订单信息
     */
    void updateWaitPurchaseBatchById(List<Order> orders);

    /**
     * 修改订单为已采购状态，并扣除商家金额
     * @param order order
     */
    void sourcingOrder(Order order);

    /**
     * 获取订单信息，发送消息给客户
     * @param orderIds
     * @return
     */
    List<SendNotifyBO> listSendNotifyBOByOrderIds(List<Long> orderIds);

    /**
     * 获取订单的退款状态信息
     */
    void getReturnOrderStatus(OrderVO orderVO);

    /**
     * 提货
     * @param orderIdList 提货单列表
     * @param userId 用户id
     * @param stationId 自提点id
     * @return 是否提货成功
     */
    Boolean orderStationByOrderId(List<Long> orderIdList, Long userId, Long stationId);

    /**
     * 获取自提点订单列表
     * @param orderDTO
     * @return
     */
    List<OrderVO> listStationOrder(OrderDTO orderDTO);

    /**
     * 判断查询条件的店铺名称，并返回店铺信息
     * @param orderSearchDTO
     * @return
     */
    Map<Long, String> checkShopName(OrderSearchDTO orderSearchDTO);

    /**
     * 判断查询条件的供应商名称，并返回供应商信息
     * @param orderSearchDTO
     * @return
     */
    Map<Long, String> checkSupplierName(OrderSearchDTO orderSearchDTO);

    List<Map<String,Object>> countPrimaryCategory(Date startTime, Date endTime);

    List<OrderOverviewVO> sumGroupByMonth(Date startTime, Date endTime);

    List<Map<String,Object>> sumGroupByArea(OrderSearchDTO orderSearchDTO);
}
